/**
 * 表单事件处理
 */
var FormAction = new Class({
	/**
	 * 提交(编辑/创建联系人)表单数据
	 * @param {element} form 表单控件
	 */
	submitEdit : function(form){
		var onFailure = function(message){
			formBuilder.setFormInfo(form, message, 'error');
			this.enableForm(form);
			return false;
		}.bind(this);
		try {
			this.disableForm(form);
			formBuilder.setFormInfo(form, '数据效验中…');
			if (!this.checkData(form)) throw new Error('错误：有不符合要求的表单项目');
			var data = {};
			data.basicData = this.getBasicData(form);
			data.customData = this.getCustomData(form);
			var idBox = $E('#id', form);
			if (idBox) {
				data.action = 'edit';
				data.basicData.id = idBox.value;
			}else {
				data.action = 'creat';
			}
			formBuilder.setFormInfo(form, '数据发送中…');
			dataCommunication.submitData(data,
			function(result){
				try {
					result = Json.evaluate(result);
					if (!result.isSucceed) return onFailure('资料传送失败,请稍后再试，若问题继续请与管理员联系…' + (result.message ? '<br />（'+result.message+'）':''));
					formBuilder.setFormInfo(form, '数据发送成功.');
					listCtrler.refreshListTable(listCtrler.openedId);
					formBuilder.closeForm(form);
				}catch(e) {
					return onFailure('数据解析失败：'+e.message);
				}
			},
			function(){
				return onFailure('资料传送失败,请稍后再试，若问题继续请与管理员联系…');
			}.bind(this));
			return true;
		}catch(e){
			return onFailure(e.message);
		}
	},
	
	/**
	 * 提交创建联系人的申请
	 * @param {Object} id
	 * @param {Object} choiceForm
	 */
	submitCreate : function(choiceForm){
		var data = {
			'action'   : 'create',
			'basicData': {
				'name' : '新建联系人',
				'brief': ''
			}
		};
		dataCommunication.submitData(data,
		//成功发送数据
		function(result){
			try {
				result = Json.evaluate(result);
				if (!result.isSucceed) throw new Error(result.message);
				choiceForm.setAffirmInfo('已经成功创建联系人');
				listCtrler.refreshListTable();
			}catch(e){
				choiceForm.setAffirmInfo('反馈失败：'+e.message);
			}
		},
		//发送数据失败
		function(){
			choiceForm.setAffirmInfo('请求发送失败,请稍后再试，若问题继续请与管理员联系…');
		}.bind(this));
	},
	
	/**
	 * 提交删除联系人的申请
	 * @param {Object} id
	 * @param {Object} choiceForm
	 */
	submitDelete : function(id, choiceForm){
		choiceForm.setInfo('提交中…');
		var data = {
			'action'   : 'delete',
			'id'       : id
		};
		dataCommunication.submitData(data,
		//成功发送数据
		function(result){
			try {
				result = Json.evaluate(result);
				if (!result.isSucceed) throw new Error(result.message);
				choiceForm.setAffirmInfo('已经成功删除联系人');
				listCtrler.refreshListTable();
			}catch(e){
				choiceForm.setAffirmInfo('反馈失败：'+e.message);
			}
		},
		//发送数据失败
		function(){
			choiceForm.setAffirmInfo('请求发送失败,请稍后再试，若问题继续请与管理员联系…');
		}.bind(this));
	},
	
	/**
	 * 禁用指定的表单(禁用表单中所有输入控件)
	 * @param {element} form 准备禁用的表单控件
	 */
	disableForm : function(form){
		$ES('input,textarea,select', form).each(function(button){
			button.setProperty('disabled', true);
		});
	},
	
	/**
	 * 启用指定的表单(启用表单中所有输入控件)
	 * @param {element} form 准备启用的表单控件
	 */
	enableForm : function(form){
		$ES('input,textarea,select', form).each(function(button){
			button.setProperty('disabled', false);
		});
	},
	
	/**
	 * 从表单中获取联系人的基本信息
	 * @param {element} form 承载信息的表单
	 * @return {Object} 联系人基本信息数据包
	 */
	getBasicData : function(form){
		var basicData = {
			'name'    : $E('#name', form).value.trim(),
			'birthday': $E('#birthday', form).value.trim() || '',
			'sex'     : $E('#sex', form).value.trim() || '',
			'remark'  : $E('#remark', form).value.trim() || ''
		};
		return basicData;
	},
	
	/**
	 * 从表单中获取联系人的自定义信息
	 * @param {element} form 承载信息的表单
	 * @return {Object} 联系人自定义信息数据包
	 */
	getCustomData : function (form) {
		result = {
			'delete': [],
			'update': [],
			'create' : []
		};
		
		$ES('div[class=inputPlace]', $E('#customArea', form)).each(function(inputPlace){
			var inputs = $ES('input', inputPlace);
			if (inputs.length <3) return;
			try {
				var pack={};
				inputs.each(function(input){
					switch (input.getProperty('class')) {
						case 'customIdBox':
							if (!input.value) throw new Error('定义异常：自定义id未赋值');
							pack['id'] = input.value;
							break;
						case 'customTitleValueBox':
							if (!input.value) throw new Error('定义异常：自定义name未赋值');
							pack['name'] = input.value;
							break;
						case 'customContent':
							pack['content'] = input.value;
							break;
						default:
							throw new Error('错误：控件类型错误');
							break;
					}
				});
				if (!pack.content && pack.id=='0') throw new Error('定义异常：新建自定义项目未赋值');
				if (!pack.content) {
					result['delete'].push(pack.id);
				}else if (pack.id=='0') {
					delete pack.id;
					result['create'].push(pack);
				}else {
					result['update'].push(pack);
				}
			}catch(e){
				alert(e.message);
				return;
			}
		}.bind(this));
		return result;
	},
	
	/**
	 * 检查(创建/编辑联系人)表单信息的数据
	 * @param {Object} form 承载信息的表单
	 * @return {bool} 表单数据全部合格返回True, 否则返回False
	 */
	checkData : function(form){
		var allValid = true;
		allValid = this.checkName($E('#name', form)) && allValid;
		allValid = this.checkBirthday($E('#birthday', form)) && allValid;
		allValid = this.checkRemark($E('#remark', form)) && allValid;
		$ES('div[class=inputPlace]', $E('#customArea', form)).each(function(inputPlace){
			var inputs = $ES('input', inputPlace);
			if (inputs.length <3) return;
			allValid = this.checkCustom(inputs) && allValid;
		}.bind(this));
		return allValid;
	},
	
	/**
	 * 检查姓名信息, 并根据检查结果更新相关结果显示控件的值
	 * @param {element} elmt 承载信息的控件
	 * @return {bool} 信息格式无误返回Turn, 否则返回Flase
	 */
	checkName : function(elmt){
		if (elmt.value) {
			result = check.scope(elmt.value, {max:20});
			this.setCheckInfo(elmt, result.message);
			return result.isValid;
		}else {
			this.setCheckInfo(elmt, '*必填');
			return false;
		}
	},
	
	/**
	 * 检查生日信息, 并根据检查结果更新相关结果显示控件的值
	 * @param {element} elmt 承载信息的控件
	 * @return {bool} 信息格式无误返回Turn, 否则返回Flase
	 */
	checkBirthday : function(elmt){
		if (elmt.value) {
			result = check.date(elmt.value);
			this.setCheckInfo(elmt, result.message);
			return result.isValid;
		}else {
			this.setCheckInfo(elmt, '');
			return true;
		}
	},
	
	/**
	 * 检查备注信息, 并根据检查结果更新相关结果显示控件的值
	 * @param {element} elmt 承载信息的控件
	 * @return {bool} 信息格式无误返回Turn, 否则返回Flase
	 */
	checkRemark : function(elmt){
		if (elmt.value) {
			result = check.scope(elmt.value, {max:255});
			this.setCheckInfo(elmt, result.message);
			return result.isValid;
		}else {
			this.setCheckInfo(elmt, '');
			return true;
		}
	},
	
	/**
	 * 检查自定义信息, 并根据检查结果更新相关结果显示控件的值
	 * @param {array} elmts 承载信息的控件数组
	 * @return {bool} 全部信息格式无误返回Turn, 否则返回Flase
	 */
	checkCustom : function(elmts){
		try {
			var isValid = true;
			var msg=[];
			elmts.each(function(input){
				if (!input.value) throw new Error('定义异常：自定义项目未赋值');
				switch (input.getProperty('type')) {
					case 'hidden':
						var result = check.scope(input.value, {max:60}, '*请控制标题在60个字符内<br />&nbsp;(1个汉字等于2个字符)');
						break;
					case 'text':
						var result = check.scope(input.value, {max:255}, '*请控制内容在255个字符内<br />&nbsp;(1个汉字等于2个字符)');
						break;
					default:
						throw new Error('错误：控件类型错误');
						break;
				}
				isValid = isValid && result.isValid;
				if (result.message) msg.push(result.message);
			});
			this.setCheckInfo(elmts[0], msg.join('<br />'));
			return isValid;
		}catch(e){
			this.setCheckInfo(elmts[0], '');
			return true;
		}
	},
	
	/**
	 * 设置被检查项目的结果反馈(更新用于结果反馈的控件的值, 如果反馈是空值则隐藏反馈信息控件)
	 * @param {element} elmt 被检查的控件
	 * @param {string} infoString 反馈的结果信息
	 * @return {bool} 设置成功返回True, 否则返回False
	 */
	setCheckInfo : function(elmt, infoString){
		try {
			while (!elmt.hasClass('inputPlace')) {
				elmt = elmt.getParent();
			}
			$E('div[class=info]', elmt)
			.setStyle('display', infoString? '' : 'none')
			.setHTML(infoString);
			return true;
		} catch(e){
			alert('未定义信息控件：'+e.message);
			return false;
		}
	}
});

/**
 * 数据内容检查方法包
 */
var check = {
	/**
	 * 获取字符串长度(将中文字符算作2个字符)
	 * @param {string} str 被检查字符串
	 * @return {int} 字符串长度值
	 */
	length : function(str){
		var len = 0;
		for (i=0; i<str.length; i++ ) {
			len += str.charCodeAt(i) > 255 ? 2 : 1 ;
		}
		return len;
	},
	
	/**
	 * 检查字符串长度知否在给定范围之内
	 * @param {string} value 被检查字符串
	 * @param {Object} scope 长度范围数据包(汉字等于2个字符), 包括(
	 *     {int} min 最小长度
	 *     {int} max 最大长度
	 * )
	 * @param {Object} msg 当字符串长度在范围之外时的反馈信息, 若不设置则由默认反馈信息代替
	 * 
	 * @return {object} 反馈信息数据包, 包括(
	 *     {bool} isValid 通过验证值为True, 否则为False
	 *     {string} info 说明检测值错误细节的反馈信息, 若通过验证则为空字符串
	 * )
	 */
	scope : function(value, scope, msg)
	{
		scope = scope || {};
		scope.min = scope.min || 0;
		scope.max = scope.max || 100;
		var info = '';
		var isValid = true;
		var valueLength = this.length(value)
		if ( valueLength > scope.max || valueLength < scope.min ){
			info = msg || '*请控制内容在'+(scope.min ? scope.min+'-' : '')+scope.max+'个字符之内<br />&nbsp;(1个汉字等于2个字符)';
			isValid = false;
		}
		return {'isValid': isValid,
		        'message': info};
	},
	
	/**
	 * 检查字符串是否是正确的日期格式(年-月-日)
	 * @param {string} value 待检查的字符串
	 * 
	 * @return {object} 反馈信息数据包, 包括(
	 *     {bool} isValid 通过验证值为True, 否则为False
	 *     {string} info 说明检测值错误细节的反馈信息, 若通过验证则为空字符串
	 */
	date : function(value)
	{
		var info = '';
		var isValid = true;
		var pattern = /^\d{4}-\d{1,2}-\d{1,2}$/;
		if ( !pattern.test(value) ){
			info = '*格式：2007-1-1';
			isValid = false;
		}
		return {'isValid': isValid,
		        'message': info};
	},
	
	/**
	 * 检查字符串是否是正确的电话号码(6-11位阿拉伯数字)
	 * @param {string} value 待检查字符串
	 * 
	 * @return {object} 反馈信息数据包, 包括(
	 *     {bool} isValid 通过验证值为True, 否则为False
	 *     {string} info 说明检测值错误细节的反馈信息, 若通过验证则为空字符串
	 */
	phone : function(value)
	{
		var info = '';
		var isValid = true;
		var pattern = /^\d{6,11}$/;
		if ( !pattern.test(value) ){
			info = '*格式错误';
			isValid = false;
		}
		return {'isValid': isValid,
		        'message': info};
	},
	
	/**
	 * 检查字符串是否是正确的座机号码(格式："0000-0000000(000)",可省略区号和分机)
	 * @param {string} value 待检查字符串
	 * 
	 * @return {object} 反馈信息数据包, 包括(
	 *     {bool} isValid 通过验证值为True, 否则为False
	 *     {string} info 说明检测值错误细节的反馈信息, 若通过验证则为空字符串
	 */
	telephone : function(value)
	{
		var info = '';
		var isValid = true;
		var pattern = /^(\d{2,}-)?\d{7,8}(\(\d+\))?$/;
		if ( !pattern.test(value) ){
			info = '*格式："0000-0000000(000)",可省略区号和分机';
			isValid = false;
		}
		return {'isValid': isValid,
		        'message': info};
	},
	
	/**
	 * 检查字符串是否是正确的手机号码(格式："+00 00000000000"，,可省略区号)
	 * @param {string} value 待检查字符串
	 * 
	 * @return {object} 反馈信息数据包, 包括(
	 *     {bool} isValid 通过验证值为True, 否则为False
	 *     {string} info 说明检测值错误细节的反馈信息, 若通过验证则为空字符串
	 */
	mobilephone : function(value)
	{
		var info = '';
		var isValid = true;
		var pattern = /^(\+\d{1,2}\s)?\d{11}$/;
		if ( !pattern.test(value) ){
			info = '*格式："+00 00000000000"，,可省略区号';
			isValid = false;
		}
		return {'isValid': isValid,
		        'message': info};
	},
	
	/**
	 * 检查字符串是否是正确的电子邮件地址
	 * @param {string} value 待检查字符串
	 * 
	 * @return {object} 反馈信息数据包, 包括(
	 *     {bool} isValid 通过验证值为True, 否则为False
	 *     {string} info 说明检测值错误细节的反馈信息, 若通过验证则为空字符串
	 */
	email : function(value)
	{
		var info = '';
		var isValid = true;
		var pattern = /^(?:([\u4E00-\u9FA5\w]{1}[\u4E00-\u9FA5\w\-]*[\u4E00-\u9FA5\w]{1})|([\u4E00-\u9FA5\w]{1}))@((?:([\u4E00-\u9FA5\w]{1}[\u4E00-\u9FA5\w\-]*[\u4E00-\u9FA5\w]{1})|([\u4E00-\u9FA5\w]{1}))\.)+([\u4E00-\u9FA5\w]{2,})+$/;
		var pattern2 = /\-\-/;
		if ( !pattern.test(value) || pattern2.test(value) ){
			info = '*格式："name@domain.xxx"';
			isValid = false;
		}
		return {'isValid': isValid,
		        'message': info};
	},
	
	/**
	 * 检查字符串是否是正确的邮政编码(6位阿拉伯数字)
	 * @param {string} value 待检查字符串
	 * 
	 * @return {object} 反馈信息数据包, 包括(
	 *     {bool} isValid 通过验证值为True, 否则为False
	 *     {string} info 说明检测值错误细节的反馈信息, 若通过验证则为空字符串
	 */
	zipcode : function(value)
	{
		var info = '';
		var isValid = true;
		var pattern = /^\d{6}$/;
		if ( !pattern.test(value) ){
			info = '*格式："000000"';
			isValid = false;
		}
		return {'isValid': isValid,
		        'message': info};
	}
};